from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from rest_framework.response import Response
from rest_framework.views import APIView
from django_redis import get_redis_connection

"""
１．前端发送ajax请求，携带参数uuid , 我们接收到uuid后返回一个验证码图片给前端
２．接收前端提供的uuid
３．生成一个随机图片
    ３．１　将随机图片的文件内容保存到redis，设置有效期１分钟
４．返回响应

请求方式　　GET
请求路径　　/verifications/imagecodes/(?P<image_code_id>.+)/
请求参数　　uuid
返回响应　　返回一个图片验证码
"""
from libs.captcha.captcha import captcha
from . import constant


class RegisterImageCodeView(APIView):
    def get(self, request, image_code_id):
        # ２．接收前端提供的uuid
        #  在路径已经接收
        # ３．生成一个随机图片
        text, image = captcha.generate_captcha()
        # ３．１　将随机图片的文件内容保存到redis，设置有效期１分钟
        #  链接redis
        redis_conn = get_redis_connection('code')
        redis_conn.setex("img_%s" % image_code_id, constant.IMAGE_CODE_EXPIRE_TIME, text)
        # ４．返回响应
        return HttpResponse(image, content_type='image/jpeg')


"""
1.当电视发送短信验证码的时候，前端发送一个ajax请求，需要将　手机号，短信验证码，　uuid传递过来
2.获取前端传递过来的数据
3.使用序列化器进行校验
4.校验成功生成一个短信验证码，并将短信验证码保存到redis中
5.校验成功调用云通讯发送短信
6.返回响应

请求方式　　GET
请求路径　　verifications/sms_code/(?P<mobile>1[345789]\d{9})/?text=xxx&image_code_id=xxx
请求参数　　mobile(手机号)  text(短信验证码)  uuid(随机字符串)
返回响应　　OK
"""

from .serializers import RegisterSmsCodeSerializer
from libs.yuntongxun.sms import CCP


class RegisterSmsCodeView(APIView):
    def get(self, request, mobile):
        # 2.获取前端传递过来的数据
        params = request.query_params
        # 3.使用序列化器进行校验
        serializer = RegisterSmsCodeSerializer(data=params)
        #  必须调用is_valid　序列化器才会执行
        serializer.is_valid(raise_exception=True)
        # 4.校验成功生成一个短信验证码，并将短信验证码保存到redis中
        from random import randint
        sms_code = '%06d' % randint(0, 999999)
        redis_coon = get_redis_connection('code')
        redis_coon.setex('sms_%s' % mobile, constant.SMS_CODE_TIME, sms_code)
        # 5.校验成功调用云通讯发送短信
        # ccp = CCP()
        from celery_tasks.sms.tasks import send_sms_code
        try:
            # ccp.send_template_sms(mobile, [sms_code, constant.YUN_TONG_XUN_SMS_CODE_TIME/60], 1)
            #  deloy 的参数是和　send_sms_code 的参数是对应的
            send_sms_code.delay(mobile, sms_code)
        except Exception:
            raise HttpResponse('云通讯异常')
        # 6.返回响应
        return Response({'msg': 'ok'})
